對於.NET
的工程師來說最幸福的就是我們有史上最強的IDE: Visual Studio,隨便你要上山還是下海,用著Visual Studio就像是開著蝙蝠車一樣橫行天下。
But!! 強大如Visual Studio也是有缺點的,例如說某天布魯斯要去公司露個臉,總不能開著蝙蝠車去吧,這時在車庫裡的藍寶堅尼就派上用場了,這台藍寶堅尼就是我們本篇的主角LINQPad。
介紹LINQPad的以下主題:
如上面的故(廢)事(文)所說的,LINQPad之於Visual Studio就像是跑車之於戰車一樣,Visual Studio的功能強大,要做任何事情都難不倒它,但缺點就是太笨重了,消耗的資源太多,如果我們只是要做一些程式片段的驗證測試或是學習還要開啟Visual Studio然後創建專案,光是想到就會讓人卻步,這時候LINQPad就派上用場了,它有下列的優點:
接下來我們來看看要怎麼使用LINQPad吧。
請至官網的下載頁面下載,有安裝版及免安裝版,.NET Framework版本就選擇你目前開發的版本:
LINQPad有付費版本,個人覺得付費版本很實用的功能有:
目前我是用免費版本的,用起來就很好用了,如果有上述需求也可以考慮付費的版本。
在官網的購買頁面有更詳細的資訊。
介面分為四個部分:
對介面有初步的認識後我們就來用LINQPad寫一些程式吧。
對於C#,LINQPad有三種編寫方式:
;
)DateTime.Now.ToString("yyyy/MM/dd")
可以看到Result直接輸出結果,在測試或學習Method時很好用。
from word in "The quick brown fox jumps over the lazy dog".Split()
orderby word.Length
select word
就算是分成多行,只要還是一個陳述式就算是Expression。對於要找出期望的資料很好用。
class
,直接寫入程式碼片段,每行程式碼結束時要加上分號(;
)var words =
from word in "The quick brown fox jumps over the lazy dog".Split()
orderby word.ToUpper()
select word;
var duplicates =
from word in words
group word.ToUpper() by word.ToUpper() into g
where g.Count() > 1
select new { g.Key, Count = g.Count() };
words.Dump();
duplicates.Dump();
void Main()
{
Test t = new Test();
t.Hello().Dump();
World().Dump();
}
string World(){
return "World";
}
class Test{
public string Hello(){
return "Hello";
}
}
你沒看錯!!最外面是不需要再一層Class的,可以直接寫所需的程式碼,是不是很方便阿。
當然如果你外面還是想要包Class(跟正規的程式相同)的話也可以,請參考LINQPad>Samples>LINQPad Tutorial & Reference>Scratchpad Features>Basic Features>Pasting in programs from the outside world。
在LINQPad上如果有需要引入參考的話有兩個方式:
進入Query Properties頁面,按下Add... 或是 Browse... 按鈕選擇需要的參考加到程式中
在沒有LINQPad的幫助下,我們要測試用LINQ抓取的資料庫資料是否正確時,我們需要做下面兩件事:
接著我們才能開始撰寫LINQ,這一來一往間就耗掉了許多的時間,這時就該是LINQPad出場的時候了。
現在我們要幫LINQ設定好DB的連線方式。
from p in Products
let spanishOrders = p.OrderDetails.Where (o => o.Order.ShipCountry == "Spain")
where spanishOrders.Any()
orderby p.ProductName
select new
{
p.ProductName,
p.Category.CategoryName,
Orders = spanishOrders.Count(),
TotalValue = spanishOrders.Sum (o => o.UnitPrice * o.Quantity)
}
有沒有想要查詢資料庫時卻不想打開資料庫工具呢?這時候LINQPad又可以派上用場了(萬能阿~~)。
照著下面的步驟來取得Northwind中單價(UnitPrice)最高的產品(Products):
Select top 1 * from Products
order by UnitPrice desc
上述的範例如果還看不過癮的話,在LINQPad>Samples>LINQPad Tutorial & Reference>5-minute induction>But I don't have NORTHWIND! 中展示了Create Table
、Insert Data
的演練,可以參考一下。
有時候我們會想要寫個可以在全部的程式碼片段使用的通用Method,這時LINQPad的Extension Method就派上用場了,在MyExtensions
這個Class中撰寫Method就可以在每個程式碼片段中做使用(就像是LINQPad內建的Dump一樣)。
MyExtensions
的ClassHello
到MyExtensions
中public static void Hello()
{
Console.Write("Hello");
}
Hello
的字串MyExtensions.Hello();
ConsoleWriteLine
public static void ConsoleWriteLine(this string str)
{
Console.WriteLine(str);
}
ConsoleWriteLine
,最後就會像下圖一樣Extension Methods的好處在於你可以擴充自己的Infrastructure,來縮減每個程式碼片段重複的處理。
有時候我們會常常參考某些好用的程式碼,這時就會想要找個地方存起來等要的時候再拿出來。
在LINQPad中有儲存程式碼片段的功能:
在Help>Keyboard/Mouse Shortcuts
可以打開快捷鍵表
選取想要執行的片段按下執行
或是F5
就可以執行片段程式碼
LINQPad自己有提供Dump,讓開發者可以更產出更清楚的結果,關於Dump的詳細說明可以參考作者自己在StackOverflow的回答: LINQPad extension methods。
LINQPad是一個麻雀雖小,五臟俱全的開發工具,在這個章節中我們學到了如何運用這功能強大的工具,下個章節我們要來找尋foreach
中所隱藏的秘密嘍。
void Main()
{
Test t = new Test();
t.Hello().Dump();
World().Dump();
}
string World(){
return "World";
}
class Test{
public string Hello(){
return "Hello";
}
}
1.我把這段程式碼 用 dotnet build
會有錯誤...
t.Hello().Dump();
World().Dump();
dump() 這兩個錯誤
2.不知道 LinqPad如何實踐 Dump()的???